package com.sp2p.util;

import java.util.Calendar;

public class CertNoUtil {
	private static int ID_LENGTH = 17;
	
	public static boolean vIDNumByRegex(String idNum) {
		String curYear = "" + Calendar.getInstance().get(Calendar.YEAR);
		int y3 = Integer.valueOf(curYear.substring(2, 3));
		int y4 = Integer.valueOf(curYear.substring(3, 4));
		// 43 0103 1973 0 9 30 051 9
		return idNum
				.matches("^(1[1-5]|2[1-3]|3[1-7]|4[1-6]|5[0-4]|6[1-5]|71|8[1-2])\\d{4}(19\\d{2}|20([0-"
						+ (y3 - 1)
						+ "][0-9]|"
						+ y3
						+ "[0-"
						+ y4
						+ "]))(((0[1-9]|1[0-2])(0[1-9]|[1-2][0-9]|3[0-1])))\\d{3}([0-9]|x|X)$");
		// 44 1825 1988 0 7 1 3 003 4
	}

	public static boolean vIDNumByCode(String idNum) {

		// 系数列表
		int[] ratioArr = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };

		// 校验码列表
		char[] checkCodeList = { '1', '0', 'X', '9', '8', '7', '6', '5', '4',
				'3', '2' };

		// 获取身份证号字符数组
		char[] cIds = idNum.toCharArray();

		// 获取最后一位（身份证校验码）
		char oCode = cIds[ID_LENGTH];
		int[] iIds = new int[ID_LENGTH];
		int idSum = 0;// 身份证号第1-17位与系数之积的和
		int residue = 0;// 余数(用加出来和除以11，看余数是多少？)

		for (int i = 0; i < ID_LENGTH; i++) {
			iIds[i] = cIds[i] - '0';
			idSum += iIds[i] * ratioArr[i];
		}

		residue = idSum % 11;// 取得余数

		return Character.toUpperCase(oCode) == checkCodeList[residue];
	}

	public static boolean vId(String idNum) {
		return vIDNumByCode(idNum) && vIDNumByRegex(idNum);
	}

	public static void main(String[] args) {
		String idNum = "362426198812193852";
		System.out.println(vId(idNum));
	}
}
